package club.gskj.gulimall.product.exception;

import club.gskj.common.exception.BizCodeEnume;
import club.gskj.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;
import java.util.Map;

/**
 * @author : Connor-G 康纳-郭
 * @date : 18:42 21.1.17
 * @Company : http://www.zzrgsoft.org
 * @Version : 1.0
 */

/**
 * 集中处理controller异常
 */
@Slf4j
@RestControllerAdvice(basePackages = {"club.gskj.gulimall.product.controller"})
public class GulimallExceptionAdviceController {

    /**
     * 处理 解释303 数据校验异常
     */
    @ExceptionHandler(value = {MethodArgumentNotValidException.class})
    public R handException(MethodArgumentNotValidException e) {
        log.error("数据校验出现异常：{},异常类型：{}", e.getMessage(), e.getClass());
        BindingResult bindingResult = e.getBindingResult();
        // 判断是否校验成功
        Map<String, Object> map = new HashMap<>();
        // 获取校验失败的结果
        bindingResult.getFieldErrors().forEach(field -> {
            // FieldError
            // 错误提示
            String message = field.getDefaultMessage();
            // 属性名称
            String fieldName = field.getField();
            map.put(fieldName, message);
        });
        // 返回封装过的错误信息
        return R.error(BizCodeEnume.VALID_EXCEPTION
                .getCode(), BizCodeEnume.VALID_EXCEPTION.getMsg()).put("data", map);
    }

    @ExceptionHandler(value = {Throwable.class})
    public R handException(Throwable throwable) {
        log.error("错误", throwable);
        return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),
                BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
    }
}
